package com.cskaoyan.javase.oop1._5this;

/**
 * this关键字
 * 学习完对象与类后，做以下练习：
 *
 * 创建一个汽车类，有颜色（color）和速度（speed）两个属性，行为是可以跑（run）。
 * 实现：
 * 在run成员方法中访问速度和颜色两个属性，调用该方法查看结果。
 * 在run成员方法的形参列表中，添加一个局部变量speed，不修改方法体，调用该方法查看结果。
 *
 * 在这种场景下,存在同名的方法局部变量和成员变量时,它们两个变量都是可以匹配的
 * 这时要考虑"就近原则"
 * 很明显,局部变量更近,所以这里会输出局部变量的speed
 *
 * 在这种情况下,有没有办法去访问同名的成员变量呢?
 * 需要使用this关键字
 *
 * this关键字:
 *      在一个类中的每个成员方法中,方法的形参列表中,总是隐含了一个隐式的传参
 *      这个传参就是这个类的对象,就是当前对象
 *      这个对象用引用"this"指向它
 *      this指向当前对象,然后作为一个隐式传参作为该成员方法的一个隐式形参
 *
 *      何为当前对象?
 *      简单来说,哪个对象来调用这个成员方法,对于该成员方法来说,这个对象就是当前对象
 *
 *      this关键字如何来解决同名成员变量和局部变量的同时使用呢?
 *      this是一个引用,所以用this.成员变量名
 *      即可表示类中的成员变量,而不是同名局部变量
 *
 *  this关键字的作用:
 *      1.用来区分同名的成员变量和局部变量
 *      2.类中每个成员方法的形参中,总是隐含this传参,所以成员方法中可以无条件访问类中的其它成员方法和成员变量.当然this本身就是隐式传参,在不必要的时候,完全可以省略.
 *      3.如果代码如果复杂,用this点访问成员变量或者成员方法,可以提升一定的代码可读性
 *
 *
 *  最后补充一个小细节:
 *      static修饰的静态方法,是不能直接访问成员变量的.这是因为static方法中没有隐含的this传参,static方法中没有当前对象,所以不能访问.
 *      当然也是可以访问的,可以手动创建一个对象,然后来访问对象的成员变量
 *
 *
 * @since 15:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Car c = new Car();
        c.run(200);
        // System.out.println(c);

        Car c2 = new Car();
        c2.run(100);
    }
}

class Car {
    String color = "白色";
    double speed = 80;

    // 行为是可以跑(run)
    public void run(double speed) {
        // 在成员方法中直接打印this关键字
        System.out.println(this);
        System.out.println(color + "的小汽车,嘟嘟嘟的,以" + this.speed + "的时速在奔驰！");
        test();
    }

    public void test() {
    }

    public void test(int a) {
    }

    public static void testStatic(){
        // System.out.println(this);
        Car c = new Car();
        System.out.println(c.color);
        System.out.println(c.speed);
        c.run(100);
    }
}